package arithmetic.mergetwolist;

/**
 * 将两个升序链表合并为一个新的 升序 链表并返回。
 * 新链表是通过拼接给定的两个链表的所有节点组成的
 *
 */
public class Test {

    public static void main(String[] args) {
    }

    /**
     * 时间复杂度o(m+n)
     * 空间复杂度o(1)
     * @param list1
     * @param list2
     * @return
     */
    public static ListNode mergeTwoLists1(ListNode list1,ListNode list2){
        ListNode listNode = new ListNode();
        ListNode p=listNode.next;
        while (list1!=null & list2!=null){
            if(list1.val<list2.val){
                p.next=list1;
                list1=list1.next;
            }else {
                p.next=list2;
                list2=list2.next;
            }
            p=p.next;
        }
        if(list1!=null){
            p.next=list1;
        }
        if(list2!=null){
            p.next=list2;
        }
        return listNode.next;
    }

    /**
     * 时间复杂度O(m+n)
     * 空间复杂度O(m+n)
     * 递归
     * @param list1
     * @param list2
     * @return
     */
    public static ListNode mergeTwoLists2(ListNode list1,ListNode list2){
        if (list1 == null) return list2;
        if (list2 == null) return list1;
        if(list1.val<list2.val){
            list1.next=mergeTwoLists2(list1.next,list2);
            return list1;
        }
        list2.next=mergeTwoLists2(list1,list2.next);
        return list2;
    }

}


class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}

